home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / glibmm-2.4 / proc / m4 / signal.m4 < prev    next >
Text File  |  2006-04-20  |  6KB  |  221 lines

  1.  
  2. #
  3. # --------------------------- Signal Decl----------------------------
  4. #
  5.  
  6. dnl _SIGNAL_PROXY($1 = c_signal_name,
  7. dnl               $2 = c_return_type,
  8. dnl               $3 = `<c_arg_types_and_names>',
  9. dnl               $4 = cpp_signal_name,
  10. dnl               $5 = cpp_return_type,
  11. dnl               $6 = `<cpp_arg_types>',
  12. dnl               $7 = `<c_args_to_cpp>',
  13. dnl               $8 = `custom_c_callback (boolean)')
  14. dnl               $9 = `refdoc_comment')
  15.  
  16. define(`_SIGNAL_PROXY',`
  17. $9
  18.   Glib::SignalProxy`'_NUM($6)< $5`'_COMMA_PREFIX($6) > signal_$4`'();
  19. dnl
  20. _PUSH(SECTION_ANONYMOUS_NAMESPACE)
  21. dnl
  22. ifelse($2`'_NUM($3)`'$5`'_NUM($6),`void0void0',`dnl
  23. dnl
  24. dnl Use predefined callback for SignalProxy0<void>, to reduce code size.
  25.  
  26. const Glib::SignalProxyInfo __CPPNAME__`'_signal_$4_info =
  27. {
  28.   "$1",
  29.   (GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
  30.   (GCallback) &Glib::SignalProxyNormal::slot0_void_callback
  31. };
  32. ',`dnl else
  33.  
  34. ifelse($8,`1',,`dnl Do not generate the implementation if it should be custom:
  35. $2 __CPPNAME__`'_signal_$4_callback`'(__CNAME__`'* self, _COMMA_SUFFIX($3)`'void* data)
  36. {
  37.   using namespace __NAMESPACE__;
  38.   typedef sigc::slot< $5`'_COMMA_PREFIX($6) > SlotType;
  39.  
  40.   // Do not try to call a signal on a disassociated wrapper.
  41.   if(Glib::ObjectBase::_get_current_wrapper((GObject*) self))
  42.   {
  43.     try
  44.     {
  45.       if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot`'(data))
  46. ifelse(`$2',void,`dnl
  47.         (*static_cast<SlotType*>(slot))($7);
  48. ',`dnl else
  49.         return _CONVERT($5,$2,`(*static_cast<SlotType*>(slot))($7)');
  50. ')dnl endif
  51.     }
  52.     catch(...)
  53.     {
  54.       Glib::exception_handlers_invoke();
  55.     }
  56.   }
  57. ifelse($2,void,,`dnl else
  58.  
  59.   typedef $2 RType;
  60.   return RType`'();
  61. ')dnl
  62. }
  63. ifelse($2,void,,`dnl else
  64.  
  65. $2 __CPPNAME__`'_signal_$4_notify_callback`'(__CNAME__`'* self, _COMMA_SUFFIX($3)`' void* data)
  66. {
  67.   using namespace __NAMESPACE__;
  68.   typedef sigc::slot< void`'_COMMA_PREFIX($6) > SlotType;
  69.  
  70.   // Do not try to call a signal on a disassociated wrapper.
  71.   if(Glib::ObjectBase::_get_current_wrapper((GObject*) self))
  72.   {
  73.     try
  74.     {
  75.       if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot`'(data))
  76.         (*static_cast<SlotType*>(slot))($7);
  77.     }
  78.     catch(...)
  79.     {
  80.       Glib::exception_handlers_invoke();
  81.     }
  82.   }
  83.  
  84.   typedef $2 RType;
  85.   return RType`'();
  86. }
  87. ')dnl endif
  88. ')dnl endif
  89.  
  90. const Glib::SignalProxyInfo __CPPNAME__`'_signal_$4_info =
  91. {
  92.   "$1",
  93.   (GCallback) &__CPPNAME__`'_signal_$4_callback,
  94.   (GCallback) &__CPPNAME__`'_signal_$4_`'ifelse($2,void,,notify_)`'callback
  95. };
  96. ')dnl endif
  97.  
  98. _SECTION(SECTION_CC_SIGNALPROXIES)
  99. Glib::SignalProxy`'_NUM($6)< $5`'_COMMA_PREFIX($6) > __CPPNAME__::signal_$4`'()
  100. {
  101.   return Glib::SignalProxy`'_NUM($6)< $5`'_COMMA_PREFIX($6) >(this, &__CPPNAME__`'_signal_$4_info);
  102. }
  103.  
  104. _POP()')
  105.  
  106.  
  107. dnl
  108. dnl _SIGNAL_PH(gname, crettype, cargs and names)
  109. dnl Create a callback and set it in our derived G*Class.
  110. dnl
  111. define(`_SIGNAL_PH',`dnl
  112. _PUSH(SECTION_PCC_CLASS_INIT_DEFAULT_SIGNAL_HANDLERS)
  113.   klass->$1 = `&'$1_callback;
  114. _SECTION(SECTION_PH_DEFAULT_SIGNAL_HANDLERS)
  115.   static $2 $1_callback`'($3);
  116. _POP()')
  117.  
  118.  
  119.  
  120. dnl                $1      $2       $3        $4
  121. dnl _SIGNAL_PCC(cppname,gname,cpprettype,crettype,
  122. dnl                        $5                $6          $7            $8
  123. dnl                  `<cargs and names>',`<cnames>',`<cpparg names>',firstarg)
  124. dnl
  125. define(`_SIGNAL_PCC',`dnl
  126. _PUSH(SECTION_PCC_DEFAULT_SIGNAL_HANDLERS)
  127. $4 __CPPNAME__`'_Class::$2_callback`'($5)
  128. {
  129. dnl  We cast twice to allow for multiple-inheritance casts, which might 
  130. dnl  change the value.  We have to use a dynamic_cast because we do not 
  131. dnl  know the actual type from which to cast up.
  132.   CppObjectType *const obj = dynamic_cast<CppObjectType*>(
  133.       Glib::ObjectBase::_get_current_wrapper`'((GObject*)$8));
  134.  
  135. _IMPORT(SECTION_CHECK)
  136.   // Non-gtkmmproc-generated custom classes implicitly call the default
  137.   // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc-
  138.   // generated classes can use this optimisation, which avoids the unnecessary
  139.   // parameter conversions if there is no possibility of the virtual function
  140.   // being overridden:
  141.   if(obj && obj->is_derived_())
  142.   {
  143.     try // Trap C++ exceptions which would normally be lost because this is a C callback.
  144.     {
  145.       // Call the virtual member method, which derived classes might override.
  146. ifelse($4,void,`dnl
  147.       obj->on_$1`'($7);
  148. ',`dnl
  149.       return _CONVERT($3,$4,`obj->on_$1`'($7)');
  150. ')dnl
  151.     }
  152.     catch(...)
  153.     {
  154.       Glib::exception_handlers_invoke`'();
  155.     }
  156.   }
  157.   else
  158.   {
  159.     BaseClassType *const base = static_cast<BaseClassType*>(
  160. ifdef(`__BOOL_IS_INTERFACE__',`dnl
  161.         _IFACE_PARENT_FROM_OBJECT($8)dnl
  162. ',`dnl
  163.         _PARENT_GCLASS_FROM_OBJECT($8)dnl
  164. ')    );
  165. dnl    g_assert(base != 0);
  166.  
  167.     // Call the original underlying C function:
  168.     if(base && base->$2)
  169.       ifelse($4,void,,`return ')(*base->$2)`'($6);
  170.   }
  171. ifelse($4,void,,`dnl
  172.  
  173.   typedef $4 RType;
  174.   return RType`'();
  175. ')dnl
  176. }
  177.  
  178. _POP()')
  179.  
  180.  
  181. dnl                    $1      $2       $3 
  182. dnl _SIGNAL_H(signame,rettype,`<cppargs>')
  183. dnl
  184. define(`_SIGNAL_H',`dnl
  185. _PUSH(SECTION_H_DEFAULT_SIGNAL_HANDLERS)
  186.   virtual $2 on_$1`'($3);
  187. _POP()')
  188.  
  189. dnl              $1      $2     $3     $4         $5          $6            $7      $8
  190. dnl _SIGNAL_CC(signame,gname,rettype,crettype,`<cppargs>',`<carg_names>', const, refreturn)
  191. dnl
  192. define(`_SIGNAL_CC',`dnl
  193. _PUSH(SECTION_CC_DEFAULT_SIGNAL_HANDLERS)
  194. $3 __NAMESPACE__::__CPPNAME__::on_$1`'($5)
  195. {
  196.   BaseClassType *const base = static_cast<BaseClassType*>(
  197. ifdef(`__BOOL_IS_INTERFACE__',`dnl
  198.       _IFACE_PARENT_FROM_OBJECT(gobject_)dnl
  199. ',`dnl
  200.       _PARENT_GCLASS_FROM_OBJECT(gobject_)dnl
  201. ')  );
  202. dnl  g_assert(base != 0);
  203.  
  204.   if(base && base->$2)
  205. ifelse($3,void,`dnl
  206.     (*base->$2)`'(gobj`'()`'_COMMA_PREFIX($6));
  207. ',`dnl
  208. ifelse($8,refreturn,`dnl Assume Glib::wrap() is correct if refreturn is requested.
  209.     return Glib::wrap((*base->$2)`'(ifelse(`$7',1,const_cast<__CNAME__*>(gobj()),gobj())`'_COMMA_PREFIX($6)), true);
  210. ',`dnl
  211.     return _CONVERT($4,$3,`(*base->$2)`'(ifelse(`$7',1,const_cast<__CNAME__*>(gobj()),gobj())`'_COMMA_PREFIX($6))');
  212. ')dnl
  213.  
  214.   typedef $3 RType;
  215.   return RType`'();
  216. ')dnl
  217. }
  218.  
  219. _POP()')
  220.  
  221.